home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume6 / xldimage / patch5 < prev    next >
Encoding:
Internet Message Format  |  1990-03-30  |  36.6 KB

  1. Path: uunet!mailrus!ames!sun-barr!newstop!sun!harvard.harvard.edu!jimf%saber
  2. From: jimf%saber@harvard.harvard.edu
  3. Newsgroups: comp.sources.x
  4. Subject: v06i058: xloadimage, Patch5
  5. Message-ID: <133719@sun.Eng.Sun.COM>
  6. Date: 30 Mar 90 18:03:43 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 1272
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: jimf%saber@harvard.harvard.edu
  12. Posting-number: Volume 6, Issue 58
  13. Archive-name: xldimage/patch5
  14. Patch-To: xldimage: Volume 5, Issues 27,28,30
  15. Patch-To: xldimage: Volume 6, Issues 1,2
  16.  
  17. Enclosed is part 1 of 1 of a patch to bring xloadimage version 1
  18. patchlevel 04 up to patchlevel 05.  This patchlevel contains the
  19. following bug-fixes and enhancements:
  20.  
  21.     * Makefile enhancements for Saber-C users
  22.     * The titlebar is now correct when halftoning
  23.     * Greyscale Sun Rasterfiles are now supported
  24.     * Fullscreen viewing is available with the -fullscreen option
  25.     * Slideshow viewing is available with the -slideshow option
  26.  
  27. To apply this patch, you should make a virgin patchlevel 04 directory
  28. and type "patch < patch.05" and hopefully you'll have an updated
  29. version a few seconds later.
  30.  
  31. Enjoy,
  32.  
  33. jim frost
  34. saber software
  35. jimf@saber.com
  36.  
  37. -- cut here (src.PARTNUM.shar) --
  38.  
  39. -- cut here (patch.05) --
  40. diff -c xloadimage.04/Makefile.std xloadimage.05/Makefile.std
  41. *** xloadimage.04/Makefile.std    Fri Mar  2 19:02:00 1990
  42. --- xloadimage.05/Makefile.std    Thu Feb 22 15:01:45 1990
  43. ***************
  44. *** 11,18 ****
  45.   CP= cp
  46.   LN= ln -s
  47.   RM= rm -f
  48.   LIBS= -lX11
  49.   OBJS= bright.o clip.o compress.o dither.o faces.o fill.o gif.o \
  50.         halftone.o imagetypes.o merge.o misc.o new.o options.o path.o \
  51.         pbm.o reduce.o root.o send.o sunraster.o value.o window.o \
  52. --- 11,23 ----
  53.   CP= cp
  54.   LN= ln -s
  55.   RM= rm -f
  56.   LIBS= -lX11
  57. + SRCS= bright.c clip.c compress.c dither.c faces.c fill.c gif.c \
  58. +       halftone.c imagetypes.c merge.c misc.c new.c options.c path.c \
  59. +       pbm.c reduce.c root.c send.c sunraster.c value.c window.c \
  60. +       xbitmap.c xloadimage.c xpixmap.c zio.c zoom.c 
  61.   OBJS= bright.o clip.o compress.o dither.o faces.o fill.o gif.o \
  62.         halftone.o imagetypes.o merge.o misc.o new.o options.o path.o \
  63.         pbm.o reduce.o root.o send.o sunraster.o value.o window.o \
  64. ***************
  65. *** 46,48 ****
  66. --- 51,70 ----
  67.           >> $(SYSPATHFILE)
  68.       echo "extension=.csun .msun .sun .face .xbm .bm .gif" \
  69.           >>$(SYSPATHFILE)
  70. + # these targets are for those of us who have Saber-C
  71. + # load all objects in saber.  useful if you then swap the portions to debug
  72. + # for source.
  73. + objinsaber:
  74. +     #setopt ccargs -g -DSYSPATHFILE=\\\"$(SYSPATHFILE)\\\"
  75. +     #load $(OBJS) $(LIBS)
  76. +     #link
  77. + # load all sources in saber.  not as useful as the last one.
  78. + srcinsaber:
  79. +     #setopt load_flags -DSYSPATHFILE=\\\"$(SYSPATHFILE)\\\"
  80. +     #load $(SRCS) $(LIBS)
  81. +     #link
  82. diff -c xloadimage.04/README xloadimage.05/README
  83. *** xloadimage.04/README    Fri Mar  2 19:02:01 1990
  84. --- xloadimage.05/README    Sun Mar 18 18:14:39 1990
  85. ***************
  86. *** 140,142 ****
  87. --- 140,147 ----
  88.   in send.c; this was fixed.  A bug relating to -border and monochrome
  89.   displays was fixed.  There were several changes to the Imakefile and
  90.   Makefiles.
  91. + Patchlevel 05 contained enhancements to allow slideshows and
  92. + fullscreen viewing, some bug fixes related to scrolling around within
  93. + images, Saber-C makefile enhancements, a bug fix to the halftoning
  94. + title, and the addition of greyscale Sun Rasterfile support.
  95. diff -c xloadimage.04/clip.c xloadimage.05/clip.c
  96. *** xloadimage.04/clip.c    Fri Mar  2 19:02:01 1990
  97. --- xloadimage.05/clip.c    Fri Mar  2 15:50:29 1990
  98. ***************
  99. *** 55,61 ****
  100.       startmask= 0x80 >> (clipx % 8);
  101.       sline= simage->data + (slinelen * clipy);
  102.       dline= image->data;
  103. -     dp= image->data;
  104.       for (y= 0; y < cliph; y++) {
  105.         sp= sline + start;
  106.         dp= dline;
  107. --- 55,60 ----
  108. diff -c xloadimage.04/halftone.c xloadimage.05/halftone.c
  109. *** xloadimage.04/halftone.c    Fri Mar  2 19:02:04 1990
  110. --- xloadimage.05/halftone.c    Wed Mar 14 18:23:47 1990
  111. ***************
  112. *** 68,74 ****
  113.     image= newBitImage(cimage->width * 4, cimage->height * 4);
  114.     if (cimage->title) {
  115.       image->title= (char *)malloc(strlen(cimage->title) + 12);
  116. !     sprintf(image->title, "%s (dithered)", cimage->title);
  117.     }
  118.     spl= cimage->pixlen;
  119.     dll= (image->width / 8) + (image->width % 8 ? 1 : 0);
  120. --- 68,74 ----
  121.     image= newBitImage(cimage->width * 4, cimage->height * 4);
  122.     if (cimage->title) {
  123.       image->title= (char *)malloc(strlen(cimage->title) + 12);
  124. !     sprintf(image->title, "%s (halftoned)", cimage->title);
  125.     }
  126.     spl= cimage->pixlen;
  127.     dll= (image->width / 8) + (image->width % 8 ? 1 : 0);
  128. diff -c xloadimage.04/image.h xloadimage.05/image.h
  129. *** xloadimage.04/image.h    Fri Mar  2 19:02:04 1990
  130. --- xloadimage.05/image.h    Sun Mar 18 15:19:30 1990
  131. ***************
  132. *** 88,100 ****
  133.   void reduceRGBMap(); /* reduce.c */
  134.   void reduce();
  135.   
  136. - void imageOnRoot(); /* root.c */
  137.   unsigned long memToVal(); /* value.c */
  138.   void          valToMem();
  139.   unsigned long memToValLSB();
  140.   void          valToMemLSB();
  141. - void imageInWindow(); /* window.c */
  142.   
  143.   Image *zoom(); /* zoom.c */
  144. --- 88,96 ----
  145. diff -c xloadimage.04/misc.c xloadimage.05/misc.c
  146. *** xloadimage.04/misc.c    Fri Mar  2 19:02:05 1990
  147. --- xloadimage.05/misc.c    Sun Mar 18 17:32:06 1990
  148. ***************
  149. *** 20,25 ****
  150. --- 20,26 ----
  151.     printf("  -onroot               - load image onto root window\n");
  152.     printf("  -border colorname     - border image with this color\n");
  153.     printf("  -display dispname     - destination display\n");
  154. +   printf("  -fullscreen           - use entire screen for display\n");
  155.     printf("  -geometry WxH+X+Y     - destination size and location\n");
  156.     printf("  -help                 - print this help message\n");
  157.     printf("  -identify             - identify given images\n");
  158. ***************
  159. *** 27,32 ****
  160. --- 28,34 ----
  161.     printf("  -install              - explicitly install colormap\n");
  162.     printf("  -path                 - show image path for loading\n");
  163.     printf("  -quiet                - silence is golden\n");
  164. +   printf("  -slideshow            - show show images in slideshow style\n");
  165.     printf("  -supported            - show supported image types\n");
  166.     printf("  -verbose              - whistle while you work\n");
  167.     printf("  -version              - show version and patchlevel\n");
  168. ***************
  169. *** 81,88 ****
  170.         options->clipw= image->width;
  171.       if (!options->cliph)
  172.         options->cliph= image->height;
  173. !     tmpimage= clip(image, options->clipx, options->clipy, options->clipw,
  174. !            options->cliph, verbose);
  175.       freeImage(image);
  176.       image= tmpimage;
  177.     }
  178. --- 83,92 ----
  179.         options->clipw= image->width;
  180.       if (!options->cliph)
  181.         options->cliph= image->height;
  182. !     tmpimage= clip(image, options->clipx, options->clipy,
  183. !            (options->clipw ? options->clipw : image->width),
  184. !            (options->cliph ? options->cliph : image->height),
  185. !            verbose);
  186.       freeImage(image);
  187.       image= tmpimage;
  188.     }
  189. ***************
  190. *** 119,128 ****
  191.         tmpimage= halftone(image, verbose);
  192.       freeImage(image);
  193.       image= tmpimage;
  194. -     options->clipx *= 4;      /* image was blown up by 4 */
  195. -     options->clipy *= 4;
  196. -     options->clipw *= 4;
  197. -     options->cliph *= 4;
  198.     }
  199.     else if (!compressed)       /* make sure colormap is minimized */
  200.       compress(image, verbose);
  201. --- 123,128 ----
  202. diff -c xloadimage.04/new.c xloadimage.05/new.c
  203. *** xloadimage.04/new.c    Fri Mar  2 19:02:06 1990
  204. --- xloadimage.05/new.c    Fri Mar  9 14:32:22 1990
  205. ***************
  206. *** 89,94 ****
  207. --- 89,95 ----
  208.       image->title= NULL;
  209.     }
  210.     freeRGBMapData(&(image->rgb));
  211. +   lfree(image->data);
  212.   }
  213.   
  214.   void freeImage(image)
  215. diff -c xloadimage.04/patchlevel xloadimage.05/patchlevel
  216. *** xloadimage.04/patchlevel    Fri Mar  2 19:02:06 1990
  217. --- xloadimage.05/patchlevel    Mon Mar 19 10:18:42 1990
  218. ***************
  219. *** 2,5 ****
  220.    */
  221.   
  222.   #define VERSION    "1"
  223. ! #define PATCHLEVEL "04"
  224. --- 2,5 ----
  225.    */
  226.   
  227.   #define VERSION    "1"
  228. ! #define PATCHLEVEL "05"
  229. diff -c xloadimage.04/path.c xloadimage.05/path.c
  230. *** xloadimage.04/path.c    Fri Mar  2 19:02:07 1990
  231. --- xloadimage.05/path.c    Fri Mar 16 10:55:38 1990
  232. ***************
  233. *** 10,19 ****
  234.   
  235.   #include "copyright.h"
  236.   #include "xloadimage.h"
  237. ! #include <sys/file.h>
  238. ! #include <sys/types.h>
  239.   #include <sys/stat.h>
  240. - #include <unistd.h>
  241.   #include <pwd.h>
  242.   #include <errno.h>
  243.   
  244. --- 10,17 ----
  245.   
  246.   #include "copyright.h"
  247.   #include "xloadimage.h"
  248. ! #include <X11/Xos.h>
  249.   #include <sys/stat.h>
  250.   #include <pwd.h>
  251.   #include <errno.h>
  252.   
  253. diff -c xloadimage.04/sunraster.c xloadimage.05/sunraster.c
  254. *** xloadimage.04/sunraster.c    Fri Mar  2 19:02:08 1990
  255. --- xloadimage.05/sunraster.c    Sun Mar 18 18:09:00 1990
  256. ***************
  257. *** 32,38 ****
  258.     }
  259.     printf(" %dx%d ", memToVal(header->width, 4), memToVal(header->height, 4));
  260.     if (memToVal(header->depth, 4) > 1)
  261. !     printf("%d plane color", memToVal(header->depth, 4));
  262.     else
  263.       printf("monochrome");
  264.     printf(" Sun rasterfile\n");
  265. --- 32,41 ----
  266.     }
  267.     printf(" %dx%d ", memToVal(header->width, 4), memToVal(header->height, 4));
  268.     if (memToVal(header->depth, 4) > 1)
  269. !     printf("%d plane %s",
  270. !            memToVal(header->depth, 4),
  271. !            (memToVal(header->maplen, 4) > 0 ? "color" : "greyscale")
  272. !            );
  273.     else
  274.       printf("monochrome");
  275.     printf(" Sun rasterfile\n");
  276. ***************
  277. *** 187,192 ****
  278. --- 190,198 ----
  279.     else
  280.       linelen= image->width * image->pixlen;
  281.     fill= (linelen % 2 ? 1 : 0);
  282. +   /*
  283. +    *  Handle color...
  284. +    */
  285.     if (mapsize= memToVal(header.maplen, 4)) {
  286.       map= lmalloc(mapsize);
  287.       if (zread(zf, map, mapsize) < mapsize) {
  288. ***************
  289. *** 205,210 ****
  290. --- 211,239 ----
  291.       lfree(map);
  292.       image->rgb.used= mapsize;
  293.     }
  294. +   /*
  295. +    *  Handle 8-bit greyscale via a simple ramp function...
  296. +    */
  297. +   else if (depth > 1) {
  298. +     mapsize = 256*3;
  299. +     map= lmalloc(mapsize);
  300. +     for (y = 0; y < 256; y += 1) {
  301. +       map[y] = map[256+y] = map[2*256+y] = y;
  302. +     }
  303. +     mapsize /= 3;
  304. +     mapred= map;
  305. +     mapgreen= mapred + mapsize;
  306. +     mapblue= mapgreen + mapsize;
  307. +     for (y= 0; y < mapsize; y++) {
  308. +       *(image->rgb.red + y)= (*(mapred++) << 8);
  309. +       *(image->rgb.green + y)= (*(mapgreen++) << 8);
  310. +       *(image->rgb.blue + y)= (*(mapblue++) << 8);
  311. +     }
  312. +     lfree(map);
  313. +     image->rgb.used= mapsize;
  314. +   }
  315. +     
  316.   
  317.     enc= (memToVal(header.type, 4) == RRLENCODED);
  318.     lineptr= image->data;
  319. Only in xloadimage.05: sunraster.c.orig
  320. diff -c xloadimage.04/window.c xloadimage.05/window.c
  321. *** xloadimage.04/window.c    Fri Mar  2 19:02:09 1990
  322. --- xloadimage.05/window.c    Sun Mar 18 18:04:01 1990
  323. ***************
  324. *** 10,17 ****
  325. --- 10,20 ----
  326.   
  327.   #include "copyright.h"
  328.   #include "xloadimage.h"
  329. + #include <ctype.h>
  330.   #include <X11/cursorfont.h>
  331.   
  332. + static Window ImageWindow= 0;
  333.   static void setCursor(disp, window, iw, ih, ww, wh, cursor)
  334.        Display      *disp;
  335.        Window        window;
  336. ***************
  337. *** 33,55 ****
  338.     *cursor= swa.cursor;
  339.   }
  340.   
  341. ! void imageInWindow(disp, scrn, image, winx, winy, winwidth, winheight, install,
  342. !            verbose)
  343.        Display      *disp;
  344.        int           scrn;
  345.        Image        *image;
  346.        unsigned int  winx, winy, winwidth, winheight;
  347.        unsigned int  install;
  348.        unsigned int  verbose;
  349.   { Pixmap               pixmap;
  350.     Colormap             xcmap;
  351.     XSetWindowAttributes swa;
  352.     XSizeHints           sh;
  353.     XGCValues            gcv;
  354.     GC                   gc;
  355. -   Window               window;
  356.     int                  pixx, pixy;
  357.     int                  lastx, lasty, mousex, mousey;
  358.     union {
  359.       XEvent              event;
  360.       XAnyEvent           any;
  361. --- 36,140 ----
  362.     *cursor= swa.cursor;
  363.   }
  364.   
  365. ! /* place an image
  366. !  */
  367. ! static void placeImage(width, height, winwidth, winheight, rx, ry)
  368. !      int width, height, winwidth, winheight;
  369. !      int *rx, *ry; /* supplied and returned */
  370. ! { int pixx, pixy;
  371. !   pixx= *rx;
  372. !   pixy= *ry;
  373. !   if (winwidth > width)
  374. !     pixx= (winwidth - width) / 2;
  375. !   else {
  376. !     if ((pixx < 0) && (pixx + width < winwidth))
  377. !       pixx= winwidth - width;
  378. !     if (pixx > 0)
  379. !       pixx= 0;
  380. !   }
  381. !   if (winheight > height)
  382. !     pixy= (winheight - height) / 2;
  383. !   else {
  384. !     if ((pixy < 0) && (pixy + height < winheight))
  385. !       pixy= winheight - height;
  386. !     if (pixy > 0)
  387. !       pixy= 0;
  388. !   }
  389. !   *rx= pixx;
  390. !   *ry= pixy;
  391. ! }
  392. ! /* blit an image
  393. !  */
  394. ! static void blitImage(disp, pixmap, window, gc, pixx, pixy, width, height,
  395. !               winwidth, winheight, x, y, w, h)
  396. !      Display *disp;
  397. !      Pixmap   pixmap;
  398. !      Window   window;
  399. !      GC       gc;
  400. !      int      pixx, pixy, width, height, winwidth, winheight, x, y, w, h;
  401. ! {
  402. !   if (x + w > winwidth)
  403. !     w= winwidth - x;
  404. !   if (y + h > winheight)
  405. !     h= winheight - y;
  406. !   if (x < pixx) {
  407. !     XClearArea(disp, window, x, y, pixx - x, y + h, False);
  408. !     w -= (pixx - x);
  409. !     x= pixx;
  410. !   }
  411. !   if (y < pixy) {
  412. !     XClearArea(disp, window, x, y, w, pixy - y, False);
  413. !     h -= (pixy - y);
  414. !     y= pixy;
  415. !   }
  416. !   if (x + w > pixx + width) {
  417. !     XClearArea(disp, window, pixx + width, y, w - width, h, False);
  418. !     w= width;
  419. !   }
  420. !   if (y + h > pixy + height) {
  421. !     XClearArea(disp, window, x, pixy + height, w, h - height, False);
  422. !     h= height;
  423. !   }
  424. !   XCopyArea(disp, pixmap, ImageWindow, gc, x - pixx, y - pixy, w, h,
  425. !         x, y);
  426. ! }
  427. ! /* clean up static window if we're through with it
  428. !  */
  429. ! void cleanUpWindow(disp)
  430. !      Display *disp;
  431. ! {
  432. !   if (ImageWindow)
  433. !     XDestroyWindow(disp, ImageWindow);
  434. !   ImageWindow= 0;
  435. ! }
  436. ! char imageInWindow(disp, scrn, image, winx, winy, winwidth, winheight,
  437. !            fullscreen, install, slideshow, verbose)
  438.        Display      *disp;
  439.        int           scrn;
  440.        Image        *image;
  441.        unsigned int  winx, winy, winwidth, winheight;
  442. +      unsigned int  fullscreen;
  443.        unsigned int  install;
  444. +      unsigned int  slideshow;
  445.        unsigned int  verbose;
  446.   { Pixmap               pixmap;
  447.     Colormap             xcmap;
  448.     XSetWindowAttributes swa;
  449.     XSizeHints           sh;
  450. +   XWMHints             wmh;
  451.     XGCValues            gcv;
  452.     GC                   gc;
  453.     int                  pixx, pixy;
  454.     int                  lastx, lasty, mousex, mousey;
  455. +   int                  paint;
  456.     union {
  457.       XEvent              event;
  458.       XAnyEvent           any;
  459. ***************
  460. *** 65,85 ****
  461.      * we will not exceed 90% of display real estate.
  462.      */
  463.   
  464. !   lastx= (winwidth || winheight);
  465. !   if (!winwidth) {
  466. !     winwidth= image->width;
  467. !     if (winwidth > DisplayWidth(disp, scrn) * 0.9)
  468. !       winwidth= DisplayWidth(disp, scrn) * 0.9;
  469.     }
  470. !   if (!winheight) {
  471. !     winheight= image->height;
  472. !     if (winheight > DisplayHeight(disp, scrn) * 0.9)
  473. !       winheight= DisplayHeight(disp, scrn) * 0.9;
  474.     }
  475.   
  476.     if (! sendImageToX(disp, scrn, DefaultVisual(disp, scrn),
  477.                image, &pixmap, &xcmap, verbose))
  478.       exit(1);
  479.     swa.backing_store= NotUseful;
  480.     swa.bit_gravity= NorthWestGravity;
  481.     swa.cursor= XCreateFontCursor(disp, XC_watch);
  482. --- 150,177 ----
  483.      * we will not exceed 90% of display real estate.
  484.      */
  485.   
  486. !   if (fullscreen) {
  487. !     winwidth= DisplayWidth(disp, scrn);
  488. !     winheight= DisplayHeight(disp, scrn);
  489.     }
  490. !   else {
  491. !     lastx= (winwidth || winheight); /* user set size flag */
  492. !     if (!winwidth) {
  493. !       winwidth= image->width;
  494. !       if (winwidth > DisplayWidth(disp, scrn) * 0.9)
  495. !     winwidth= DisplayWidth(disp, scrn) * 0.9;
  496. !     }
  497. !     if (!winheight) {
  498. !       winheight= image->height;
  499. !       if (winheight > DisplayHeight(disp, scrn) * 0.9)
  500. !     winheight= DisplayHeight(disp, scrn) * 0.9;
  501. !     }
  502.     }
  503.   
  504.     if (! sendImageToX(disp, scrn, DefaultVisual(disp, scrn),
  505.                image, &pixmap, &xcmap, verbose))
  506.       exit(1);
  507. +   swa.background_pixel= 0;
  508.     swa.backing_store= NotUseful;
  509.     swa.bit_gravity= NorthWestGravity;
  510.     swa.cursor= XCreateFontCursor(disp, XC_watch);
  511. ***************
  512. *** 87,130 ****
  513.     swa.event_mask= ButtonPressMask | Button1MotionMask | KeyPressMask |
  514.       ExposureMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask;
  515.     swa.save_under= False;
  516. !   window= XCreateWindow(disp, RootWindow(disp, scrn), 0, 0,
  517. !             image->width, image->height, 0,
  518. !             DefaultDepth(disp, scrn),
  519. !             InputOutput, CopyFromParent,
  520. !             CWBackingStore | CWBitGravity | CWCursor |
  521. !             CWColormap | CWEventMask | CWSaveUnder, &swa);
  522. !   XStoreName(disp, window, image->title);
  523. !   XSetIconName(disp, window, image->title);
  524.   
  525.     sh.width= winwidth;
  526.     sh.height= winheight;
  527. !   sh.min_width= 1;
  528. !   sh.min_height= 1;
  529. !   sh.max_width= image->width;
  530. !   sh.max_height= image->height;
  531.     sh.width_inc= 1;
  532.     sh.height_inc= 1;
  533.     sh.flags= PMinSize | PMaxSize | PResizeInc;
  534. !   if (lastx)
  535.       sh.flags |= USSize;
  536.     else
  537.       sh.flags |= PSize;
  538. !   if (winx || winy) {
  539.       sh.x= winx;
  540.       sh.y= winy;
  541.       sh.flags |= USPosition;
  542.     }
  543. !   XSetNormalHints(disp, window, &sh);
  544.   
  545.     gcv.function= GXcopy;
  546.     gcv.foreground= 0;
  547. !   gc= XCreateGC(disp, window, GCFunction | GCForeground, &gcv);
  548. !   XMapWindow(disp, window);
  549. !   pixx= pixy= 0;
  550. !   lastx= lasty= -1;
  551. !   setCursor(disp, window, image->width, image->height,
  552.           winwidth, winheight, &(swa.cursor));
  553.   
  554.     for (;;) {
  555.       XNextEvent(disp, &event);
  556.       switch (event.any.type) {
  557. --- 179,249 ----
  558.     swa.event_mask= ButtonPressMask | Button1MotionMask | KeyPressMask |
  559.       ExposureMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask;
  560.     swa.save_under= False;
  561. !   swa.override_redirect= (fullscreen ? True : False);
  562. !   if (!ImageWindow) {
  563. !     ImageWindow= XCreateWindow(disp, RootWindow(disp, scrn), 0, 0,
  564. !                    winwidth, winheight, 0,
  565. !                    DefaultDepth(disp, scrn),
  566. !                    InputOutput, CopyFromParent,
  567. !                    CWBackPixel | CWBackingStore |
  568. !                    CWBitGravity | CWCursor | CWColormap |
  569. !                    CWEventMask | CWSaveUnder, &swa);
  570. !     paint= 0;
  571. !   }
  572. !   else {
  573. !     XResizeWindow(disp, ImageWindow, winwidth, winheight);
  574. !     paint= 1;
  575. !   }
  576. !   XStoreName(disp, ImageWindow, image->title);
  577. !   XSetIconName(disp, ImageWindow, image->title);
  578.   
  579.     sh.width= winwidth;
  580.     sh.height= winheight;
  581. !   if (fullscreen) {
  582. !     sh.min_width= sh.max_width= winwidth;
  583. !     sh.min_height= sh.max_height= winheight;
  584. !   }
  585. !   else {
  586. !     sh.min_width= 1;
  587. !     sh.min_height= 1;
  588. !     sh.max_width= image->width;
  589. !     sh.max_height= image->height;
  590. !   }
  591.     sh.width_inc= 1;
  592.     sh.height_inc= 1;
  593.     sh.flags= PMinSize | PMaxSize | PResizeInc;
  594. !   if (lastx || fullscreen)
  595.       sh.flags |= USSize;
  596.     else
  597.       sh.flags |= PSize;
  598. !   if (fullscreen) {
  599. !     sh.x= sh.y= 0;
  600. !     sh.flags |= USPosition;
  601. !   }
  602. !   else if (winx || winy) {
  603.       sh.x= winx;
  604.       sh.y= winy;
  605.       sh.flags |= USPosition;
  606.     }
  607. !   XSetNormalHints(disp, ImageWindow, &sh);
  608.   
  609. +   wmh.input= True;
  610. +   wmh.flags= InputHint;
  611. +   XSetWMHints(disp, ImageWindow, &wmh);
  612.     gcv.function= GXcopy;
  613.     gcv.foreground= 0;
  614. !   gc= XCreateGC(disp, ImageWindow, GCFunction | GCForeground, &gcv);
  615. !   XMapWindow(disp, ImageWindow);
  616. !   placeImage(image->width, image->height, winwidth, winheight, &pixx, &pixy);
  617. !   if (paint)
  618. !     blitImage(disp, pixmap, ImageWindow, gc,
  619. !           pixx, pixy, image->width, image->height, winwidth, winheight,
  620. !           0, 0, winwidth, winheight);
  621. !   setCursor(disp, ImageWindow, image->width, image->height,
  622.           winwidth, winheight, &(swa.cursor));
  623.   
  624. +   lastx= lasty= -1;
  625.     for (;;) {
  626.       XNextEvent(disp, &event);
  627.       switch (event.any.type) {
  628. ***************
  629. *** 140,157 ****
  630.         char buf[128];
  631.         KeySym ks;
  632.         XComposeStatus status;
  633.   
  634.         XLookupString(&event.key,buf,128,&ks,&status);
  635. !       if (buf[0]=='q' || buf[0]=='Q') {
  636. !         XDestroyWindow(disp, window);
  637. !         XFreeCursor(disp, swa.cursor);
  638. !         XFreePixmap(disp, pixmap);
  639.       if (xcmap != DefaultColormap(disp, scrn))
  640.             XFreeColormap(disp, xcmap);
  641. !         return;
  642.         }
  643. -     }
  644.         break;
  645.   
  646.       case MotionNotify:
  647.         if ((image->width <= winwidth) && (image->height <= winheight))
  648. --- 259,290 ----
  649.         char buf[128];
  650.         KeySym ks;
  651.         XComposeStatus status;
  652. +       char ret;
  653. +       Cursor cursor;
  654.   
  655.         XLookupString(&event.key,buf,128,&ks,&status);
  656. !       ret= buf[0];
  657. !       if (isupper(ret))
  658. !     ret= tolower(ret);
  659. !       switch (ret) {
  660. !       case 'n':
  661. !       case 'p':
  662. !     cursor= swa.cursor;
  663. !     swa.cursor= XCreateFontCursor(disp, XC_watch);
  664. !     XChangeWindowAttributes(disp, ImageWindow, CWCursor, &swa);
  665. !     XFreeCursor(disp, cursor);
  666. !     XFlush(disp);
  667. !     /* FALLTHRU */
  668. !       case '\003': /* ^C */
  669. !       case 'q':
  670. !     XFreeCursor(disp, swa.cursor);
  671. !     XFreePixmap(disp, pixmap);
  672.       if (xcmap != DefaultColormap(disp, scrn))
  673.             XFreeColormap(disp, xcmap);
  674. !     return(ret);
  675.         }
  676.         break;
  677. +     }
  678.   
  679.       case MotionNotify:
  680.         if ((image->width <= winwidth) && (image->height <= winheight))
  681. ***************
  682. *** 162,185 ****
  683.       mousex= event.button.x;
  684.       mousey= event.button.y;
  685.         }
  686. !       pixx += lastx - mousex;
  687. !       pixy += lasty - mousey;
  688.         lastx= mousex;
  689.         lasty= mousey;
  690. !       if (image->width > winwidth) {
  691. !     if (pixx < 0)
  692. !       pixx= 0;
  693. !     if (pixx + winwidth > image->width)
  694. !       pixx= image->width - winwidth;
  695. !       }
  696. !       if (image->height > winheight) {
  697. !     if (pixy < 0)
  698. !       pixy= 0;
  699. !     if (pixy + winheight > image->height)
  700. !       pixy= image->height - winheight;
  701. !       }
  702. !       XCopyArea(disp, pixmap, window, gc,
  703. !         pixx, pixy, winwidth, winheight, 0, 0);
  704.         break;
  705.   
  706.       case ConfigureNotify:
  707. --- 295,309 ----
  708.       mousex= event.button.x;
  709.       mousey= event.button.y;
  710.         }
  711. !       pixx -= (lastx - mousex);
  712. !       pixy -= (lasty - mousey);
  713.         lastx= mousex;
  714.         lasty= mousey;
  715. !       placeImage(image->width, image->height, winwidth, winheight,
  716. !          &pixx, &pixy);
  717. !       blitImage(disp, pixmap, ImageWindow, gc,
  718. !         pixx, pixy, image->width, image->height, winwidth, winheight,
  719. !         0, 0, winwidth, winheight);
  720.         break;
  721.   
  722.       case ConfigureNotify:
  723. ***************
  724. *** 186,210 ****
  725.         winwidth= event.configure.width;
  726.         winheight= event.configure.height;
  727.   
  728.         /* configure the cursor to indicate which directions we can drag
  729.          */
  730.   
  731. !       if (pixx + winwidth > image->width)
  732. !     pixx= image->width - winwidth;
  733. !       if (pixy + winheight > image->height)
  734. !     pixy= image->height - winheight;
  735. !       if (winwidth > image->width)
  736. !     pixx= 0;
  737. !       if (winheight > image->height)
  738. !     pixy= 0;
  739. !       setCursor(disp, window, image->width, image->height,
  740.           winwidth, winheight, &(swa.cursor));
  741.   
  742.         /* repaint 
  743.          */
  744.   
  745. !       XCopyArea(disp, pixmap, window, gc,
  746. !         pixx, pixy, winwidth, winheight, 0, 0);
  747.         break;
  748.   
  749.       case DestroyNotify:
  750. --- 310,330 ----
  751.         winwidth= event.configure.width;
  752.         winheight= event.configure.height;
  753.   
  754. +       placeImage(image->width, image->height, winwidth, winheight,
  755. +          &pixx, &pixy);
  756.         /* configure the cursor to indicate which directions we can drag
  757.          */
  758.   
  759. !       setCursor(disp, ImageWindow, image->width, image->height,
  760.           winwidth, winheight, &(swa.cursor));
  761.   
  762.         /* repaint 
  763.          */
  764.   
  765. !       blitImage(disp, pixmap, ImageWindow, gc,
  766. !         pixx, pixy, image->width, image->height, winwidth, winheight,
  767. !         0, 0, winwidth, winheight);
  768.         break;
  769.   
  770.       case DestroyNotify:
  771. ***************
  772. *** 212,224 ****
  773.         XFreePixmap(disp, pixmap);
  774.         if (xcmap != DefaultColormap(disp, scrn))
  775.       XFreeColormap(disp, xcmap);
  776. !       return;
  777.   
  778.       case Expose:
  779. !       XCopyArea(disp, pixmap, window, gc,
  780. !         pixx + event.expose.x, pixy + event.expose.y,
  781. !         event.expose.width, event.expose.height,
  782. !         event.expose.x, event.expose.y);
  783.         break;
  784.   
  785.       case EnterNotify:
  786. --- 332,344 ----
  787.         XFreePixmap(disp, pixmap);
  788.         if (xcmap != DefaultColormap(disp, scrn))
  789.       XFreeColormap(disp, xcmap);
  790. !       return('\0');
  791.   
  792.       case Expose:
  793. !       blitImage(disp, pixmap, ImageWindow, gc,
  794. !         pixx, pixy, image->width, image->height, winwidth, winheight,
  795. !         event.expose.x, event.expose.y,
  796. !         event.expose.width, event.expose.height);
  797.         break;
  798.   
  799.       case EnterNotify:
  800. diff -c xloadimage.04/xbitmap.c xloadimage.05/xbitmap.c
  801. *** xloadimage.04/xbitmap.c    Fri Mar  2 19:02:09 1990
  802. --- xloadimage.05/xbitmap.c    Fri Mar  2 15:48:39 1990
  803. ***************
  804. *** 146,152 ****
  805.   
  806.     while (zgets(line, MAX_SIZE, zf)) {
  807.       if (strlen(line) == MAX_SIZE-1) {
  808. !       fclose(zf);
  809.         return(NULL);
  810.       }
  811.   
  812. --- 146,152 ----
  813.   
  814.     while (zgets(line, MAX_SIZE, zf)) {
  815.       if (strlen(line) == MAX_SIZE-1) {
  816. !       zclose(zf);
  817.         return(NULL);
  818.       }
  819.   
  820. diff -c xloadimage.04/xloadimage.c xloadimage.05/xloadimage.c
  821. *** xloadimage.04/xloadimage.c    Fri Mar  2 19:02:10 1990
  822. --- xloadimage.05/xloadimage.c    Sun Mar 18 17:40:42 1990
  823. ***************
  824. *** 12,18 ****
  825.   #include "xloadimage.h"
  826.   #include "patchlevel"
  827.   
  828. ! /* options array and definitions
  829.    */
  830.   
  831.   char *Options[] = {
  832. --- 12,19 ----
  833.   #include "xloadimage.h"
  834.   #include "patchlevel"
  835.   
  836. ! /* options array and definitions.  note that the enum values must be in the
  837. !  * same order as the options strings.
  838.    */
  839.   
  840.   char *Options[] = {
  841. ***************
  842. *** 19,24 ****
  843. --- 20,26 ----
  844.     "onroot", /* global options */
  845.     "border",
  846.     "display",
  847. +   "fullscreen",
  848.     "geometry",
  849.     "help",
  850.     "identify",
  851. ***************
  852. *** 26,31 ****
  853. --- 28,34 ----
  854.     "install",
  855.     "path",
  856.     "quiet",
  857. +   "slideshow",
  858.     "supported",
  859.     "verbose",
  860.     "version",
  861. ***************
  862. *** 47,81 ****
  863.     NULL
  864.   };
  865.   
  866. ! #define ONROOT    0
  867. ! #define BORDER    1
  868. ! #define DISPLAY   2
  869. ! #define GEOMETRY  3
  870. ! #define HELP      4
  871. ! #define IDENTIFY  5
  872. ! #define LIST      6
  873. ! #define INSTALL   7
  874. ! #define PATH      8
  875. ! #define QUIET     9
  876. ! #define SUPPORTED 10
  877. ! #define VERBOSE   11
  878. ! #define VER_NUM   12
  879. ! #define VIEW      13
  880.   
  881. ! #define AT         14
  882. ! #define BACKGROUND 15
  883. ! #define BRIGHT     16
  884. ! #define CENTER     17
  885. ! #define CLIP       18
  886. ! #define COLORS     19
  887. ! #define DITHER     20
  888. ! #define FOREGROUND 21
  889. ! #define HALFTONE   22
  890. ! #define NAME       23
  891. ! #define XZOOM      24
  892. ! #define YZOOM      25
  893. ! #define ZOOM       26
  894.   
  895.   /* if an image loader needs to have our display and screen, it will get
  896.    * them from here.  this is done to keep most of the image routines
  897.    * clean
  898. --- 50,70 ----
  899.     NULL
  900.   };
  901.   
  902. ! enum {
  903.   
  904. !   /* global options
  905. !    */
  906.   
  907. +   ONROOT= 0, BORDER, DISPLAY, FULLSCREEN, GEOMETRY, HELP, IDENTIFY, LIST,
  908. +   INSTALL, PATH, QUIET, SLIDESHOW, SUPPORTED, VERBOSE, VER_NUM, VIEW,
  909. +   /* local options
  910. +    */
  911. +   AT, BACKGROUND, BRIGHT, CENTER, CLIP, COLORS, DITHER, FOREGROUND,
  912. +   HALFTONE, NAME, XZOOM, YZOOM, ZOOM
  913. + };
  914.   /* if an image loader needs to have our display and screen, it will get
  915.    * them from here.  this is done to keep most of the image routines
  916.    * clean
  917. ***************
  918. *** 90,100 ****
  919.   main(argc, argv)
  920.        int argc;
  921.        char *argv[];
  922. ! { unsigned int  onroot= 1;
  923.     char         *border;
  924.     char         *dname;
  925.     unsigned int  identify;
  926.     unsigned int  install;
  927.     unsigned int  verbose;
  928.     Image        *dispimage;      /* image that will be sent to the display */
  929.     Image        *newimage;       /* new image we're loading */
  930. --- 79,91 ----
  931.   main(argc, argv)
  932.        int argc;
  933.        char *argv[];
  934. ! { unsigned int  onroot;
  935.     char         *border;
  936.     char         *dname;
  937. +   unsigned int  fullscreen;
  938.     unsigned int  identify;
  939.     unsigned int  install;
  940. +   unsigned int  slideshow;
  941.     unsigned int  verbose;
  942.     Image        *dispimage;      /* image that will be sent to the display */
  943.     Image        *newimage;       /* new image we're loading */
  944. ***************
  945. *** 102,109 ****
  946.     int           scrn;           /* screen we're sending to */
  947.     XColor        xcolor;         /* color for border option */
  948.     ImageOptions  images[MAXIMAGES]; /* list of image w/ options to load */
  949.     unsigned int  imagecount;     /* number of images in ImageName array */
  950. -   unsigned int  a;
  951.     unsigned int  winx, winy;     /* location of window */
  952.     unsigned int  winwidth, winheight; /* geometry of window */
  953.   
  954. --- 93,100 ----
  955.     int           scrn;           /* screen we're sending to */
  956.     XColor        xcolor;         /* color for border option */
  957.     ImageOptions  images[MAXIMAGES]; /* list of image w/ options to load */
  958. +   int           a;
  959.     unsigned int  imagecount;     /* number of images in ImageName array */
  960.     unsigned int  winx, winy;     /* location of window */
  961.     unsigned int  winwidth, winheight; /* geometry of window */
  962.   
  963. ***************
  964. *** 127,134 ****
  965. --- 118,127 ----
  966.     }
  967.     border= NULL;
  968.     dname= NULL;
  969. +   fullscreen= 0;
  970.     identify= 0;
  971.     install= 0;
  972. +   slideshow= 0;
  973.     winx= winy= winwidth= winheight= 0;
  974.   
  975.     imagecount= 0;
  976. ***************
  977. *** 178,183 ****
  978. --- 171,180 ----
  979.         dname= argv[++a];
  980.         break;
  981.   
  982. +     case FULLSCREEN:
  983. +       fullscreen= 1;
  984. +       break;
  985.       case GEOMETRY:
  986.         XParseGeometry(argv[++a], &winx, &winy, &winwidth, &winheight);
  987.         break;
  988. ***************
  989. *** 206,211 ****
  990. --- 203,212 ----
  991.         verbose= 0;
  992.         break;
  993.   
  994. +     case SLIDESHOW:
  995. +       slideshow= 1;
  996. +       break;
  997.       case SUPPORTED:
  998.         supportedImageTypes();
  999.         break;
  1000. ***************
  1001. *** 319,324 ****
  1002. --- 320,335 ----
  1003.       exit(0);
  1004.     }
  1005.   
  1006. +   /* filter out mutually exclusive flags
  1007. +    */
  1008. +   if (onroot && slideshow) {
  1009. +     printf("\
  1010. + %s: -onroot and -slideshow are mutually exclusive (-onroot ignored)\n",
  1011. +        argv[0]);
  1012. +     onroot= 0;
  1013. +   }
  1014.     /* start talking to the display
  1015.      */
  1016.   
  1017. ***************
  1018. *** 331,337 ****
  1019.   
  1020.     dispimage= NULL;
  1021.     if (onroot && (winwidth || winheight || images[0].center ||
  1022. !       images[a].atx || images[a].aty)) {
  1023.       if (!winwidth)
  1024.       winwidth= DisplayWidth(disp, scrn);
  1025.       if (!winheight)
  1026. --- 342,348 ----
  1027.   
  1028.     dispimage= NULL;
  1029.     if (onroot && (winwidth || winheight || images[0].center ||
  1030. !       images[0].atx || images[0].aty)) {
  1031.       if (!winwidth)
  1032.       winwidth= DisplayWidth(disp, scrn);
  1033.       if (!winheight)
  1034. ***************
  1035. *** 380,392 ****
  1036.       ((dispimage && BITMAPP(dispimage)) || (DefaultDepth(disp, scrn) == 1)))
  1037.         images[a].dither= 2;
  1038.       newimage= processImage(disp, scrn, newimage, &images[a], verbose);
  1039. -     if (!images[a].clipw && !images[a].cliph) {
  1040. -       images[a].clipw= newimage->width;
  1041. -       images[a].cliph= newimage->height;
  1042. -     }
  1043.       if (images[a].center) {
  1044. !       images[a].atx= (dispimage->width - images[a].clipw) / 2;
  1045. !       images[a].aty= (dispimage->height - images[a].cliph) / 2;
  1046.       }
  1047.       if (dispimage) {
  1048.         if (! dispimage->title)
  1049. --- 391,399 ----
  1050.       ((dispimage && BITMAPP(dispimage)) || (DefaultDepth(disp, scrn) == 1)))
  1051.         images[a].dither= 2;
  1052.       newimage= processImage(disp, scrn, newimage, &images[a], verbose);
  1053.       if (images[a].center) {
  1054. !       images[a].atx= (dispimage->width - newimage->width) / 2;
  1055. !       images[a].aty= (dispimage->height - newimage->height) / 2;
  1056.       }
  1057.       if (dispimage) {
  1058.         if (! dispimage->title)
  1059. ***************
  1060. *** 396,404 ****
  1061.       }
  1062.       else
  1063.         dispimage= newimage;
  1064.     }
  1065.   
  1066. !   if (! dispimage) {
  1067.       printf("No images to display\n");
  1068.       exit(1);
  1069.     }
  1070. --- 403,435 ----
  1071.       }
  1072.       else
  1073.         dispimage= newimage;
  1074. +     if (slideshow) {
  1075. +       switch(imageInWindow(disp, scrn, dispimage, winx, winy,
  1076. +                winwidth, winheight,
  1077. +                fullscreen, install, slideshow, verbose)) {
  1078. +       case '\0': /* window got nuked by someone */
  1079. +     XCloseDisplay(disp);
  1080. +     exit(1);
  1081. +       case '\003':
  1082. +       case 'q':  /* user quit */
  1083. +     XCloseDisplay(disp);
  1084. +     exit(0);
  1085. +     
  1086. +       case 'n':  /* next image */
  1087. +     break;
  1088. +       case 'p':  /* previous image */
  1089. +     if (a > 0)
  1090. +       a -= 2;
  1091. +     else
  1092. +       a--;
  1093. +     break;
  1094. +       }
  1095. +       freeImage(dispimage);
  1096. +       dispimage= NULL;
  1097. +     }
  1098.     }
  1099.   
  1100. !   if (!slideshow && !dispimage) {
  1101.       printf("No images to display\n");
  1102.       exit(1);
  1103.     }
  1104. ***************
  1105. *** 405,412 ****
  1106.   
  1107.     if (onroot)
  1108.       imageOnRoot(disp, scrn, dispimage, verbose);
  1109. !   else
  1110. !     imageInWindow(disp, scrn, dispimage, winx, winy, winwidth, winheight,
  1111. !           install, verbose);
  1112.     XCloseDisplay(disp);
  1113.   }
  1114. --- 436,446 ----
  1115.   
  1116.     if (onroot)
  1117.       imageOnRoot(disp, scrn, dispimage, verbose);
  1118. !   else {
  1119. !     if (!slideshow)
  1120. !       imageInWindow(disp, scrn, dispimage, winx, winy, winwidth, winheight,
  1121. !             fullscreen, install, slideshow, verbose);
  1122. !     cleanUpWindow(disp);
  1123. !   }
  1124.     XCloseDisplay(disp);
  1125.   }
  1126. diff -c xloadimage.04/xloadimage.h xloadimage.05/xloadimage.h
  1127. *** xloadimage.04/xloadimage.h    Fri Mar  2 19:02:10 1990
  1128. --- xloadimage.05/xloadimage.h    Sun Mar 18 15:02:36 1990
  1129. ***************
  1130. *** 57,62 ****
  1131. --- 57,67 ----
  1132.   void loadPathsAndExts();
  1133.   void showPath();
  1134.   
  1135. + void imageOnRoot(); /* root.c */
  1136.   unsigned int sendImageToX(); /* send.c */
  1137.   
  1138.   Visual *getBestVisual(); /* visual.c */
  1139. + void cleanUpWindow(); /* window.c */
  1140. + char imageInWindow();
  1141. diff -c xloadimage.04/xloadimage.man xloadimage.05/xloadimage.man
  1142. *** xloadimage.04/xloadimage.man    Fri Mar  2 19:02:11 1990
  1143. --- xloadimage.05/xloadimage.man    Mon Mar 19 10:28:08 1990
  1144. ***************
  1145. *** 28,40 ****
  1146.   for above accuracy.
  1147.   .PP
  1148.   If you are viewing a large image in a window, the initial window will
  1149. ! be at most 90% of the size of the display (unless the window manager
  1150. ! does not correctly handle window size requests).  You may move the
  1151. ! image around in the window by dragging with the first mouse button.
  1152. ! The cursor will indicate which directions you may drag, if any.  You
  1153. ! may exit the window by typing 'q' or 'Q' when the keyboard focus is on
  1154. ! the window.
  1155.   .PP
  1156.   A wide variety of common image manipulations can be done by mixing and
  1157.   matching the available options.  See the section entitled \fIHINTS FOR
  1158.   GOOD IMAGE DISPLAYS\fR for some ideas.
  1159. --- 28,43 ----
  1160.   for above accuracy.
  1161.   .PP
  1162.   If you are viewing a large image in a window, the initial window will
  1163. ! be at most 90% of the size of the display unless the window manager
  1164. ! does not correctly handle window size requests or if you've used the
  1165. ! \fI-fullscreen\fR option.  You may move the image around in the window
  1166. ! by dragging with the first mouse button.  The cursor will indicate
  1167. ! which directions you may drag, if any.  You may exit the window by
  1168. ! typing 'q' or '^C' when the keyboard focus is on the window.
  1169.   .PP
  1170. + It's possible to have a "slideshow" of many images by specifying the
  1171. + \fI-slideshow\fR option.
  1172. + .PP
  1173.   A wide variety of common image manipulations can be done by mixing and
  1174.   matching the available options.  See the section entitled \fIHINTS FOR
  1175.   GOOD IMAGE DISPLAYS\fR for some ideas.
  1176. ***************
  1177. *** 52,57 ****
  1178. --- 55,64 ----
  1179.   -display \fIdisplay_name\fR
  1180.   X11 display name to send the image(s) to.
  1181.   .TP
  1182. + -fullscreen
  1183. + Use the entire screen to display images.  This option is incompatible
  1184. + with -onroot.
  1185. + .TP
  1186.   -geometry \fIWxH[{+-X}{+-}Y]\fR
  1187.   This sets the size of the window onto which the images are loaded to a
  1188.   different value than the size of the image.  When viewing an image in
  1189. ***************
  1190. *** 88,93 ****
  1191. --- 95,106 ----
  1192.   Forces \fIxloadimage\fR and \fIxview\fR to be quiet.  This is the
  1193.   default for \fIxsetbg\fR, but the others like to whistle. 
  1194.   .TP
  1195. + -slideshow
  1196. + Show each image argument one at a time instead of merging them.
  1197. + Typing 'p' will back up to the previous image displayed, 'n' will go
  1198. + to the next image, and 'q' or '^C' will quit.  This option is often
  1199. + used in conjunction with -fullscreen.
  1200. + .TP
  1201.   -supported
  1202.   List the supported image types. 
  1203.   .TP
  1204. ***************
  1205. *** 323,331 ****
  1206.   jimf@saber.com
  1207.   .fi
  1208.   .PP
  1209. ! Other contributing people include Barry Shein (bzs@std.com), Kirk L.
  1210. ! Johnson (tuna@athena.mit.edu), Mark Snitily (zok!mark@apple.com), and
  1211. ! W. David Higgins (wdh@mkt.csd.harris.com).
  1212.   .SH FILES
  1213.   .nf
  1214.   .in +5
  1215. --- 336,345 ----
  1216.   jimf@saber.com
  1217.   .fi
  1218.   .PP
  1219. ! Other contributing people include Barry Shein (bzs@std.com), Kirk
  1220. ! Johnson (tuna@athena.mit.edu), Mark Snitily (zok!mark@apple.com),
  1221. ! W. David Higgins (wdh@mkt.csd.harris.com), and Dave Nelson
  1222. ! (daven@gauss.llnl.gov).
  1223.   .SH FILES
  1224.   .nf
  1225.   .in +5
  1226. ***************
  1227. *** 333,339 ****
  1228.   xsetbg                  - pseudonym which quietly sets the background
  1229.   xview                   - pseudonym which views in a window
  1230.   /usr/lib/X11/Xloadimage - default system-wide configuration file
  1231. ! \~/.xloadimagerc         - user's personal configuration file
  1232.   .in -5
  1233.   .fi
  1234.   .SH COPYRIGHT
  1235. --- 347,353 ----
  1236.   xsetbg                  - pseudonym which quietly sets the background
  1237.   xview                   - pseudonym which views in a window
  1238.   /usr/lib/X11/Xloadimage - default system-wide configuration file
  1239. ! ~/.xloadimagerc         - user's personal configuration file
  1240.   .in -5
  1241.   .fi
  1242.   .SH COPYRIGHT
  1243.  
  1244. dan
  1245. -----------------------------------------------------------
  1246.             O'Reilly && Associates
  1247.         argv@sun.com / argv@ora.com
  1248.        632 Petaluma Ave, Sebastopol, CA 95472 
  1249.      800-338-NUTS, in CA: 800-533-NUTS, FAX 707-829-0104
  1250.     Opinions expressed reflect those of the author only.
  1251.